#include "head.h"
// 从文件写入管理员用户连接
void read_r_list(r_list *list, r_data data, int pos)
{
    if (list == NULL) // 判断链表是否为NULL
    {
        ERRLOG("list为NULL");
        return;
    }
    r_node *L1 = (r_node *)malloc(sizeof(r_node)); // 创建节点来接收传递的data
    L1->data = data;                               // 把管理员结构体放在L1的数据域
    L1->next = NULL;
    if (pos == 0) // pos用户判断list的用户个数，
    {
        list->next = L1; // 为0，就让list->next指向L1
        return;
    }
    r_node *ptr = list->next; // 如果pos不为0，就代码里面有值，就让ptr移动到list->nex
    if (pos == 1)             // 代表头插
    {
        L1->next = ptr;  // 让新节点指向ptr
        list->next = L1; // 头执政指向新节点
        return;          // 实现头插后返回
    }
    for (int i = 1; i < pos - 1; i++) // 不代表头插就代码中间插入或尾插，确认插入位置后进行后移
    {
        ptr = ptr->next; // ptr指向自己的下一个节点
    } // 位移到要插入的前指针
    L1->next = ptr->next; // 让新节点指向ptr的后指针
    ptr->next = L1;       // ptr指向新指针
}
// 添加管理员用户
void add_rootuser(r_list *list)
{
    r_data root;
    printf("\033[1;31;40m请输入管理员姓名\033[0m");
    scanf("%s", root.name); // 从终端输入管理员账户名
    printf("\033[1;31;40m请输入管理员密码\033[0m");
    scanf("%s", root.password); // 从终端输入管理员密码
    read_r_list(list, root, 2); // 插入
    
    printf("\033[1;34;40m添加成功\033[0m \n");
    write_r_list(list);
    fflush(stdout);
    sleep(5); // 延时五秒
    system("clear");
}
// 从文件读取
void read_r_data(r_list *list)
{
    if (list == NULL) // 判断链表是否为空
    {
        ERRLOG("list为NULL");
        return;
    }
    FILE *fp = fopen(ADMIN_FILE, "r"); // 以只读的方式打开文件
    char ch;
    int len;
    while ((ch = fgetc(fp)) != EOF) // 判断文件是否到最后一行
    {
        if (ch == '\n') // 判断字符是否为换行，一行代表一个用户
        {
            len++; // 用户加一
        }
    }
    fseek(fp, 0, SEEK_SET);       // 文件光标移动到行首
    r_data root_data;             // 创建管理员结构体，存放从文件读取的数据
    for (int i = 0; i < len; i++) // 根据人数输入多少信息
    {
        fscanf(fp, "%s\t%s\n", root_data.name, root_data.password); // 从文件读取用户信息
        read_r_list(list, root_data, i);                            // 插入链表
    }
    fclose(fp); // 释放文件
}
// 创建头指针
r_list *create_head()
{
    r_list *L1 = (r_list *)malloc(sizeof(r_list)); // 创建指针
    if (L1 == NULL)                                // 判NULL
    {
        ERRLOG("头执政创建失败");
        return NULL;
    }
    return L1; // 返回头指针
}
// 文件写入
void write_r_list(r_list *list)
{
    if (list == NULL) // 判NULL
    {
        ERRLOG("头执政创建失败");
        return;
    }
    FILE *fp = fopen(ADMIN_FILE, "w"); // 以只写的方式打开文件
    r_node *L1 = list->next;           // 创建L1节点，并且移动到头指针的下一节点
    while (L1 != NULL)                 // 判断L1是否为空，为空代表链表到达了结尾
    {
        fprintf(fp, "%s\t%s\n", L1->data.name, L1->data.password); // 写入文件
        L1 = L1->next;                                             // L1指向自己下一节点
    }
    fclose(fp); // 关闭文件
}
// 登陆判断
int root_log(r_list *list)
{
    char name[128];
    char password[128];
    printf("\033[1;31;40m请输入管理员名字\033[0m");
    scanf("%s", name);//从键盘输入注册管理员名字
    printf("\033[1;31;40m请输入管理员密码\033[0m");
    scanf("%s", password);//从键盘输入注册管理员密码
    r_node *L1 = list->next;//创建节点并移动到下一节点
    while (L1 != NULL) //判断L1是否到最后一个
    {
        if ((strcmp(L1->data.name, name) == 0) && strcmp(L1->data.password, password) == 0)//判断账号和密码是否正确
        {
            printf("\033[1;34;40m登陆成功\033[0m\n");
            fflush(stdout);//输入缓存区
            sleep(3);//延时
            system("clear");//清屏
            return 1;
        }
        L1 = L1->next;//L1指向自己的下一个节点
    }
    return 0;
}